package edu.uoc.vmerinom.tfc.action;

import java.io.Serializable;
import java.util.List;

import org.jboss.seam.ScopeType;
import org.jboss.seam.annotations.In;
import org.jboss.seam.annotations.Name;
import org.jboss.seam.annotations.Scope;

import edu.uoc.vmerinom.tfc.domain.Perfil;
import edu.uoc.vmerinom.tfc.domain.Usuario;
import edu.uoc.vmerinom.tfc.service.PerfilesService;
import edu.uoc.vmerinom.tfc.support.Message;

/**
 * Manejador que contiene las acciones relacionadas con los perfiles de usuario.
 * 
 * @author Víctor Manuel Merino Martínez
 * 
 */
@Name("perfilesAction")
@Scope(ScopeType.CONVERSATION)
public class PerfilesAction implements Serializable {

	/**
	 * Default Serial Version ID.
	 */
	private static final long serialVersionUID = 1L;

	/**
	 * Usuario autenticado.
	 */
	@In
	Usuario usuario;

	/**
	 * Servicio de perfiles.
	 */
	@In(create = true)
	PerfilesService perfilesService;

	/**
	 * Perfil seleccionado.
	 */
	Perfil perfil;

	/**
	 * Listado de perfiles.
	 */
	List<Perfil> perfiles;

	/**
	 * Lógico que indica si se mostrará el listado de perfiles.
	 */
	boolean listarPerfiles;
	/**
	 * Lógico que indica si se mostrará la edición de perfil.
	 */
	boolean editarPerfil;

	/**
	 * Carga los datos necesarios antes de mostrar la pantalla inicial.
	 */
	public void load() {
		if (usuario.getPerfil().isAdministrador()) {
			perfiles = perfilesService.obtenerPerfilesAdmin();
		} else {
			perfiles = perfilesService.obtenerPerfiles();
		}
		listarPerfiles = true;
		editarPerfil = false;
	}

	/**
	 * Carga los datos para dar de alta un nuevo perfil.
	 */
	public void nuevo() {
		perfil = new Perfil();
		editarPerfil = true;
		listarPerfiles = false;
	}

	/**
	 * Carga los datos necesarios para la edición del perfil seleccionado.
	 */
	public void editar() {
		editarPerfil = true;
		listarPerfiles = false;
	}

	/**
	 * Guarda los datos del perfil.
	 */
	public void guardar(String message) {
		if (validate()) {
			perfilesService.insertarModificarPerfil(perfil);
			load();
			Message.info(message);
		}
	}

	/**
	 * Valida los campos del perfil.
	 * 
	 * @return <code>true</code> si la validación es correcta.
	 *         <code>false</code> en caso contrario.
	 */
	private boolean validate() {
		boolean result = true;
		if (perfil.getNombre() == null) {
			Message.error("profiles.error.name.null");
			result = false;
		} else if ("".equals(perfil.getNombre())) {
			Message.error("profiles.error.name.null");
			result = false;
		} else {
			final Perfil per = perfilesService.obtenerPerfil(perfil.getNombre(), perfil.getId());
			if (per != null) {
				final Object[] params = new String[1];
				params[0] = perfil.getNombre();
				Message.error("profiles.error.name.repeated", params);
				result = false;
			}
		}
		if (perfil.getAlta() == null) {
			Message.error("profiles.error.registration.date.null");
			result = false;
		}
		return result;
	}

	/**
	 * Carga los datos necesarios para mostrar la pantalla de vuelta.
	 */
	public void volver() {
		perfilesService.actualizarEstadoPerfil(perfil);
		editarPerfil = false;
		listarPerfiles = true;
	}

	public List<Perfil> getPerfiles() {
		return perfiles;
	}

	public void setPerfiles(List<Perfil> perfiles) {
		this.perfiles = perfiles;
	}

	public boolean isListarPerfiles() {
		return listarPerfiles;
	}

	public void setListarPerfiles(boolean listarPerfiles) {
		this.listarPerfiles = listarPerfiles;
	}

	public boolean isEditarPerfil() {
		return editarPerfil;
	}

	public void setEditarPerfil(boolean editarPerfil) {
		this.editarPerfil = editarPerfil;
	}

	public Perfil getPerfil() {
		return perfil;
	}

	public void setPerfil(Perfil perfil) {
		this.perfil = perfil;
	}

}
